#!/bin/bash

# 快速释放多个端口的脚本
# 支持指定多个端口，如果不指定则默认释放3003端口

# 默认端口
DEFAULT_PORTS=(3003)

# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'

# 显示帮助信息
show_help() {
    echo "快速释放端口脚本"
    echo ""
    echo "用法: $0 [端口1] [端口2] [端口3] ..."
    echo ""
    echo "示例:"
    echo "  $0                    # 释放默认端口3003"
    echo "  $0 3003              # 释放端口3003"
    echo "  $0 3003 8080        # 释放端口3003和8080"
    echo "  $0 3003 8080 9000   # 释放端口3003、8080和9000"
    echo ""
    echo "注意: 建议使用root权限运行以获得最佳效果"
}

# 释放单个端口
release_port() {
    local port=$1
    echo -e "${BLUE}正在释放端口 $port...${NC}"
    
    # 检查端口占用
    echo "检查端口 $port 占用情况..."
    if command -v lsof &> /dev/null; then
        PIDS=$(lsof -ti :$port 2>/dev/null || true)
        if [[ -n "$PIDS" ]]; then
            echo -e "${YELLOW}发现占用端口的进程: $PIDS${NC}"
            
            # 杀死进程
            for PID in $PIDS; do
                echo "杀死进程 PID: $PID"
                if kill -9 "$PID" 2>/dev/null; then
                    echo -e "${GREEN}✓ 成功杀死进程 $PID${NC}"
                else
                    echo -e "${RED}✗ 无法杀死进程 $PID${NC}"
                fi
            done
            
            # 等待一下
            sleep 1
            
            # 验证端口是否释放
            if lsof -i :$port &>/dev/null; then
                echo -e "${RED}✗ 端口 $port 仍然被占用${NC}"
                return 1
            else
                echo -e "${GREEN}✓ 端口 $port 已成功释放${NC}"
                return 0
            fi
        else
            echo -e "${GREEN}✓ 端口 $port 当前没有被占用${NC}"
            return 0
        fi
    else
        echo "未找到lsof命令，尝试使用fuser..."
        
        if command -v fuser &> /dev/null; then
            if fuser $port/tcp &>/dev/null; then
                echo -e "${YELLOW}发现占用端口的进程，正在杀死...${NC}"
                if fuser -k $port/tcp; then
                    echo -e "${GREEN}✓ 端口 $port 已释放${NC}"
                    return 0
                else
                    echo -e "${RED}✗ 无法释放端口 $port${NC}"
                    return 1
                fi
            else
                echo -e "${GREEN}✓ 端口 $port 当前没有被占用${NC}"
                return 0
            fi
        else
            echo -e "${RED}未找到lsof或fuser命令，请手动检查端口占用${NC}"
            echo "可以使用以下命令："
            echo "  netstat -tlnp | grep :$port"
            echo "  ss -tlnp | grep :$port"
            return 1
        fi
    fi
}

# 解析命令行参数
parse_args() {
    local ports=()
    
    # 如果没有参数，使用默认端口
    if [[ $# -eq 0 ]]; then
        ports=("${DEFAULT_PORTS[@]}")
    else
        # 检查参数是否为帮助
        for arg in "$@"; do
            case $arg in
                -h|--help|help)
                    show_help
                    exit 0
                    ;;
                *)
                    # 验证端口号是否有效
                    if [[ $arg =~ ^[0-9]+$ ]] && [[ $arg -ge 1 ]] && [[ $arg -le 65535 ]]; then
                        ports+=("$arg")
                    else
                        echo -e "${RED}错误: '$arg' 不是有效的端口号 (1-65535)${NC}"
                        exit 1
                    fi
                    ;;
            esac
        done
    fi
    
    echo "$(printf '%s\n' "${ports[@]}")"
}

# 主函数
main() {
    # 检查权限
    if [[ $EUID -ne 0 ]]; then
        echo -e "${YELLOW}警告: 建议使用root权限运行此脚本${NC}"
        echo "可以使用: sudo $0 $*"
        echo ""
    fi
    
    # 解析参数
    local ports
    ports=$(parse_args "$@")
    
    # 如果没有端口，退出
    if [[ -z "$ports" ]]; then
        echo -e "${RED}错误: 没有指定有效的端口${NC}"
        show_help
        exit 1
    fi
    
    # 显示要释放的端口
    echo -e "${BLUE}准备释放以下端口:${NC}"
    echo "$ports" | while read -r port; do
        echo "  - $port"
    done
    echo ""
    
    # 统计结果
    local success_count=0
    local total_count=0
    
    # 释放每个端口
    echo "$ports" | while read -r port; do
        total_count=$((total_count + 1))
        echo "=========================================="
        if release_port "$port"; then
            success_count=$((success_count + 1))
        fi
        echo ""
    done
    
    # 显示总结
    echo "=========================================="
    echo -e "${BLUE}释放完成！${NC}"
    echo "成功释放: $success_count/$total_count 个端口"
    
    if [[ $success_count -eq $total_count ]]; then
        echo -e "${GREEN}所有端口都已成功释放！${NC}"
        exit 0
    else
        echo -e "${YELLOW}部分端口释放失败，请检查日志${NC}"
        exit 1
    fi
}

# 运行主函数
main "$@"
